#include "u_Key.h"
#include "u_Time.h"
#include "menu.h"
#include "u_Beep.h"
#include "User_App.h"
#include "Modbus_Master.h"

/***********************************************************************************************************************************/
/*                                                  新  建  按  键  对  象                                                          */
/***********************************************************************************************************************************/
Key_Function Key_obj_01 = {
    .KeyLongTimer = 800,                               // 长按时间 >800ms
    .KEYTriggerMode = 0,                               // #error 触发方式 0低电平触发、  1是高电平触发
    .KEYEnable = 1,                                    // 使能 0是禁用    1是使能(默认)
    .KEY_oneClick_event = Key_obj_01_oneClick_event,   // #error 按键单击事件
    .KEY_twoClick_event = Key_obj_01_twoClick_event,   // #error 按键双击事件
    .KEY_longClick_event = Key_obj_01_longClick_event, // #error 按键长按事件
};
Key_Function Key_obj_02 = {
    .KeyLongTimer = 800,                               // 长按时间 >800ms
    .KEYTriggerMode = 0,                               // #error 触发方式 0低电平触发、  1是高电平触发
    .KEYEnable = 1,                                    // 使能 0是禁用    1是使能(默认)
    .KEY_oneClick_event = Key_obj_02_oneClick_event,   // #error 按键单击事件
    .KEY_twoClick_event = Key_obj_02_twoClick_event,   // #error 按键双击事件
    .KEY_longClick_event = Key_obj_02_longClick_event, // #error 按键长按事件
};
Key_Function Key_obj_03 = {
    .KeyLongTimer = 800,                               // 长按时间 >800ms
    .KEYTriggerMode = 0,                               // #error 触发方式 0低电平触发、  1是高电平触发
    .KEYEnable = 1,                                    // 使能 0是禁用    1是使能(默认)
    .KEY_oneClick_event = Key_obj_03_oneClick_event,   // #error 按键单击事件
    .KEY_twoClick_event = Key_obj_03_twoClick_event,   // #error 按键双击事件
    .KEY_longClick_event = Key_obj_03_longClick_event, // #error 按键长按事件
};

// *****************************************************************************
// 按键标志位
uint8_t Key_Enter = 0; // 确认键
uint8_t Key_Back = 0;  // 返回键
uint8_t Key_Up = 0;    // 上
uint8_t Key_Down = 0;  // 下
// 确认键
int8_t Key_Enter_Get(void)
{
    if (Key_Enter)
    {
        Key_Enter = 0;
        return 1;
    }
    return 0;
}
// 返回键
int8_t Key_Back_Get(void)
{
    if (Key_Back)
    {
        Key_Back = 0;
        return 1;
    }
    return 0;
}

int8_t Key_Up_Get(void)
{
    if (Key_Up)
    {
        Key_Up = 0;
        return 1;
    }
    return 0;
}

int8_t Key_Down_Get(void)
{
    if (Key_Down)
    {
        Key_Down = 0;
        return 1;
    }
    return 0;
}

void Key_Reset_All(void) // 清除所有按键标志位
{
    Key_Enter = 0;
    Key_Back = 0;
    Key_Up = 0;
    Key_Down = 0;
}
// *****************************************************************************

// 按键定时处理函数 放在1ms定时器中
void KEY_obj_Ti_CallBack_Function(void)
{
    // #warning 将按键绑定的引脚填上
    KEY_obj_Activate(KEY01_ISIN, &Key_obj_01);
    KEY_obj_Activate(KEY02_ISIN, &Key_obj_02);
    KEY_obj_Activate(KEY03_ISIN, &Key_obj_03);
}
// 按键处理函数    放在main()中whie里主函数中循环
void KEY_All_event_Handle(void)
{
    // #warning 让主程序处理按键绑定的事件
    KEY_obj_event(&Key_obj_01);
    KEY_obj_event(&Key_obj_02);
    KEY_obj_event(&Key_obj_03);
}
// 功按键调试函数
void KEY_Debug(void)
{
    // KEY_obj_setOneClick_event(&Key_obj_01, Key_obj_Y2_oneClick_event); // 设置按键对象的 单击 事件

    while (1)
    {
        //        Ti_All_Handle();
        KEY_All_event_Handle();
    }
}

/***********************************************************************************************************************************/
/*                                                      用  户  程  序                                                              */
/***********************************************************************************************************************************/
void Key_obj_01_oneClick_event(void)
{
    mb_write_single_reg(0x01, MB_W_HEAT_STOP, (0x00 << 8) | 0x00);
    Beep_Sound(1);
}
void Key_obj_01_twoClick_event(void)
{
}
void Key_obj_01_longClick_event(void)
{
    // bsp_Task_Obj_Set_Run(&HeatWater);
}
void Key_obj_01_oneClick_OLED_event(void)
{
    Key_Down += 1;
}
void Key_obj_01_twoClick_OLED_event(void)
{
    Key_Down += 1;
} 

void Key_obj_02_oneClick_event(void)
{
    mb_write_single_reg(0x01, MB_W_HEAT_STOP, (0x00 << 8) | 0x00);
    Beep_Sound(1);
}
void Key_obj_02_twoClick_event(void)
{
    mb_write_single_reg(0x01, MB_W_HEAT_START, (info.m_Set_Heat_Tim << 8) | info.m_Set_Water_Value);
}
void Key_obj_02_longClick_event(void)
{
    // Key_Back += 1;
    // printf("Key_obj_01: longClick\n"); // 打印
    if (OLED_Menu_Get_RunListFlag() == 1)
    {
        OLED_Menu_Set_RunListFlag(0);
        KEY_obj_setOneClick_event(&Key_obj_01, Key_obj_01_oneClick_event);
        KEY_obj_setOTwoClick_event(&Key_obj_01, Key_obj_01_twoClick_event);
        KEY_obj_setOneClick_event(&Key_obj_02, Key_obj_02_oneClick_event);
        KEY_obj_setOTwoClick_event(&Key_obj_02, Key_obj_02_twoClick_event);
        KEY_obj_setOneClick_event(&Key_obj_03, Key_obj_03_oneClick_event);
        KEY_obj_setOTwoClick_event(&Key_obj_03, Key_obj_03_twoClick_event);
    }
    else if (OLED_Menu_Get_RunListFlag() == 0)
    {
        OLED_Menu_Set_RunListFlag(1);
        KEY_obj_setOneClick_event(&Key_obj_01, Key_obj_01_oneClick_OLED_event);
        KEY_obj_setOTwoClick_event(&Key_obj_01, Key_obj_01_twoClick_OLED_event);
        KEY_obj_setOneClick_event(&Key_obj_02, Key_obj_02_oneClick_OLED_event);
        KEY_obj_setOTwoClick_event(&Key_obj_02, Key_obj_02_twoClick_OLED_event);
        KEY_obj_setOneClick_event(&Key_obj_03, Key_obj_03_oneClick_OLED_event);
        KEY_obj_setOTwoClick_event(&Key_obj_03, Key_obj_03_twoClick_OLED_event);
    }
    Beep_Sound(1);
}
void Key_obj_02_oneClick_OLED_event(void)
{
    Key_Enter += 1;
}
void Key_obj_02_twoClick_OLED_event(void)
{
    Key_Enter += 1;
}

void Key_obj_03_oneClick_event(void)
{
    mb_write_single_reg(0x01, MB_W_HEAT_STOP, (0x00 << 8) | 0x00);
    Beep_Sound(1);
}
void Key_obj_03_twoClick_event(void)
{
}
void Key_obj_03_longClick_event(void)
{
    // printf("Key_obj_01: longClick\n"); // 打印
}
void Key_obj_03_oneClick_OLED_event(void)
{
    Key_Up += 1;
}
void Key_obj_03_twoClick_OLED_event(void)
{
    Key_Up += 1;
}
